package com.shujia.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Code20LeftJoin {
  def main(args: Array[String]): Unit = {
    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("CoGroup"))
    val value1RDD: RDD[(String, Int)] = sc.parallelize(List(("k1", 11), ("k1", 1), ("k2", 2), ("k3", 3)))
    val value2RDD: RDD[(String, Int)] = sc.parallelize(List(("k5", 5), ("k4", 4), ("k3", 3), ("k3", 33)))

    /**
     * leftOuterJoin
     *    作用：拿Key类型相同的RDD进行关联操作，以调用函数的RDD为主表，传入RDD作为从表，
     *          如果Key能关联上，那么会返回两个RDD的值，同时被关联的RDD值为Some类型
     *          如果Key不能关联上，会返回主RDD中的值，同时被关联的RDD值为None类型
     *
     * (k3,(3,Some(3)))
     * (k3,(3,Some(33)))
     * (k2,(2,None))
     * (k1,(11,None))
     * (k1,(1,None))
     *
     * rightOuterJoin:
     *      和LeftOuterJoin方向相反..
     *
     * (k5,(None,5))
     * (k3,(Some(3),3))
     * (k3,(Some(3),33))
     * (k4,(None,4))
     *
     * fullOuterJoin:
     *   作用：表示全关联，所有的Key都保留，如果两个RDD之间能关联上，那么其值为Some,关联不上为None
     * (k5,(None,Some(5)))
     * (k3,(Some(3),Some(3)))
     * (k3,(Some(3),Some(33)))
     * (k2,(Some(2),None))
     * (k1,(Some(11),None))
     * (k1,(Some(1),None))
     * (k4,(None,Some(4)))
     *
     */

    value1RDD
//      .leftOuterJoin(value2RDD)
//      .rightOuterJoin(value2RDD)
      .fullOuterJoin(value2RDD)
      .foreach(println)


  }
}
